home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / DATA_IO.HAS < prev    next >
Text File  |  1997-09-02  |  21KB  |  1,042 lines

  1. *-----------------------------------------------------------------------------
  2. *    ZMUSIC V3
  3. *    DATA I/O部ソース
  4. *-----------------------------------------------------------------------------
  5.     .align    4
  6. *test:                    *ここを非コメント化すると負荷に応じで画面フラッシュ
  7. m_out_entry:                *MIDI送信割り込み(CZ6BM1-0)
  8.     ori.w    #$0700,sr
  9.     movem.l    d0/a0-a1,-(sp)
  10.     lea    rgr,a0
  11.     move.b    #%0100_0000,icr-rgr(a0)    *割り込みクリア
  12.     midiwait
  13.     move.l    m_buffer_0(pc),a1
  14.     move.w    m_buffer_ip(a1),d0
  15.     move.b    #$05,(a0)
  16.     midiwait
  17. @@:
  18.     move.b    m_buffer(a1,d0.w),grp6-rgr(a0)
  19.     midiwait
  20.     addq.w    #1,d0
  21.     andi.w    #mbufsz-1,d0
  22.     subq.w    #1,m_len(a1)
  23.     beq    @f            *全部送信終了
  24.     btst.b    #6,grp4-rgr(a0)
  25.     bne    @b            *まだ書き込める
  26.     move.w    d0,m_buffer_ip(a1)
  27.     ifdef test
  28.     move.w    #%00000_00000_11111_0,$e82200    *!!!
  29.     endif
  30.     movem.l    (sp)+,d0/a0-a1
  31.     rte
  32. @@:                    *割り込みひとまず終了
  33.     clr.b    (a0)
  34.     midiwait
  35.     lea    r06_0(pc),a1
  36.     andi.b    #%1011_1111,(a1)
  37.     move.b    (a1),grp6-rgr(a0)
  38.     midiwait
  39.     ifdef test
  40.     clr.w    $e82200                *!!!
  41.     endif
  42.     movem.l    (sp)+,d0/a0-a1
  43.     rte
  44.  
  45. m_out_entry2:                *MIDI送信割り込み(CZ6BM1-1)
  46.     ori.w    #$0700,sr
  47.     movem.l    d0/a0-a1,-(sp)
  48.     lea    rgr+$10,a0
  49.     move.b    #%0100_0000,icr-rgr(a0)    *割り込みクリア
  50.     midiwait
  51.     move.l    m_buffer_1(pc),a1
  52.     move.w    m_buffer_ip(a1),d0
  53.     move.b    #$05,(a0)
  54.     midiwait
  55. @@:
  56.     move.b    m_buffer(a1,d0.w),grp6-rgr(a0)
  57.     midiwait
  58.     addq.w    #1,d0
  59.     andi.w    #mbufsz-1,d0
  60.     subq.w    #1,m_len(a1)
  61.     beq    @f            *全部送信終了
  62.     btst.b    #6,grp4-rgr(a0)
  63.     bne    @b            *まだ書き込める
  64.     move.w    d0,m_buffer_ip(a1)
  65.     ifdef test
  66.     move.w    #%00000_11111_00000_0,$e82200    *!!!
  67.     endif
  68.     movem.l    (sp)+,d0/a0-a1
  69.     rte
  70. @@:                    *割り込みひとまず終了
  71.     clr.b    (a0)
  72.     midiwait
  73.     lea    r06_1(pc),a1
  74.     andi.b    #%1011_1111,(a1)
  75.     move.b    (a1),grp6-rgr(a0)
  76.     midiwait
  77.     ifdef test
  78.     clr.w    $e82200                *!!!
  79.     endif
  80.     movem.l    (sp)+,d0/a0-a1
  81.     rte
  82.  
  83. m_out_entry_r:                *RS-MIDI送信割り込み
  84.     ori.w    #$0700,sr
  85.     movem.l    d0/a0-a1,-(sp)
  86.     lea    scc_a,a0
  87.     move.l    m_buffer_r(pc),a1
  88.     tst.w    m_len(a1)
  89.     beq    @f
  90.     ifdef test
  91.     move.w    #%11111_00000_00000_0,$e82200    *!!!
  92.     endif
  93.     move.w    m_buffer_ip(a1),d0
  94.     move.b    m_buffer(a1,d0.w),2(a0)
  95.     addq.w    #1,d0
  96.     andi.w    #mbufsz-1,d0
  97.     move.w    d0,m_buffer_ip(a1)
  98.     subq.w    #1,m_len(a1)
  99.     bne    exit_moer        *全部送信終了
  100. @@:
  101.     ifdef test
  102.     clr.w    $e82200            *!!!
  103.     endif
  104.     tst.b    (a0)            *!!!Dummy
  105.     move.b    #$28,(a0)        *割り込みクリア
  106. exit_moer:
  107.     move.b    #$38,(a0)        *割り込みクリア
  108.     movem.l    (sp)+,d0/a0-a1
  109.     rte
  110.  
  111. _m_out_m0:                *CZ6BM1-0
  112.     jmp    @f.l
  113. @@:
  114.     cmpi.b    #$f7,d0
  115.     bne    m_out_m0
  116.     clr.b    stat0-work(a6)        *clear status byte
  117.     move.w    sr,-(sp)
  118.     andi.w    #$f8ff,sr        *all int. enable
  119. @@:
  120.     btst.b    #6,r06_0(pc)        *割り込みモードか
  121.     bne    @b            *yes
  122.     ori.w    #$0700,sr
  123.     lea    rgr,a4
  124.     move.b    #5,(a4)
  125.     midiwait
  126. @@:
  127.     btst.b    #6,grp4-rgr(a4)
  128.     beq    @b
  129.     move.b    d0,grp6-rgr(a4)
  130.     midiwait
  131.     move.w    (sp)+,sr
  132.                     *EOX後のウェイト
  133.     move.w    d2,-(sp)
  134.     move.w    eox_w+0(pc),d2
  135.     subq.w    #1,d2
  136. @@:
  137.     bsr    v_wait
  138.     dbra    d2,@b
  139.     move.w    (sp)+,d2
  140.     rts
  141.  
  142. _m_out_m1:                *CZ6BM1-1
  143.     jmp    @f.l
  144. @@:
  145.     cmpi.b    #$f7,d0
  146.     bne    m_out_m1
  147.     clr.b    stat1-work(a6)        *clear status byte
  148.     move.w    sr,-(sp)
  149.     andi.w    #$f8ff,sr        *all int. enable
  150. @@:
  151.     btst.b    #6,r06_1(pc)        *割り込みモードか
  152.     bne    @b            *yes
  153.     ori.w    #$0700,sr
  154.     lea    rgr+$10,a4
  155.     move.b    #5,(a4)
  156.     midiwait
  157. @@:
  158.     btst.b    #6,grp4-rgr(a4)
  159.     beq    @b
  160.     move.b    d0,grp6-rgr(a4)
  161.     midiwait
  162.     move.w    (sp)+,sr
  163.                     *EOX後のウェイト
  164.     move.w    d2,-(sp)
  165.     move.w    eox_w+2(pc),d2
  166.     subq.w    #1,d2
  167. @@:
  168.     bsr    v_wait
  169.     dbra    d2,@b
  170.     move.w    (sp)+,d2
  171.     rts
  172.  
  173. _m_out_r0:                *RS232C 0
  174.     jmp    @f.l
  175. @@:
  176.     cmpi.b    #$f7,d0
  177.     bne    m_out_r0
  178.     clr.b    statr0-work(a6)        *clear status byte
  179.     move.l    m_buffer_r(pc),a4
  180.     move.w    sr,-(sp)
  181.     andi.w    #$f8ff,sr        *all int. enable
  182. @@:
  183.     tst.w    m_len(a4)        *割り込みモードか
  184.     bne    @b            *yes
  185.     ori.w    #$0700,sr
  186.     lea    scc_a,a4
  187.     tst.b    (a4)            *!!!Dummy
  188. @@:
  189.     btst.b    #2,(a4)
  190.     beq    @b
  191. *    move.w    (sp)+,sr        *03/10
  192.     move.b    d0,2(a4)
  193.                     *EOX後のウェイト
  194.     move.w    d2,-(sp)
  195.     move.w    eox_w+4(pc),d2
  196.     subq.w    #1,d2
  197. @@:
  198.     bsr    v_wait
  199.     dbra    d2,@b
  200.     move.w    (sp)+,d2
  201.     move.w    (sp)+,sr        *03/20
  202.     rts
  203.  
  204. _m_out_r1:                *RS232C
  205.     jmp    @f.l
  206. @@:
  207.     cmpi.b    #$f7,d0
  208.     bne    m_out_r1
  209.     clr.b    statr1-work(a6)        *clear status byte
  210.     move.l    m_buffer_r(pc),a4
  211.     move.w    sr,-(sp)
  212.     andi.w    #$f8ff,sr        *all int. enable
  213. @@:
  214.     tst.w    m_len(a4)        *割り込みモードか
  215.     bne    @b            *yes
  216.     ori.w    #$0700,sr
  217.     lea    scc_a,a4
  218.     tst.b    (a4)            *!!!Dummy
  219. @@:
  220.     btst.b    #2,(a4)
  221.     beq    @b
  222. *    move.w    (sp)+,sr        *03/10
  223.     move.b    d0,2(a4)
  224.                     *EOX後のウェイト
  225.     move.w    d2,-(sp)
  226.     move.w    eox_w+6(pc),d2
  227.     subq.w    #1,d2
  228. @@:
  229.     bsr    v_wait
  230.     dbra    d2,@b
  231.     move.w    (sp)+,d2
  232.     move.w    (sp)+,sr        *03/20
  233.     rts
  234.  
  235. _m_out:                    *nmdb!(RTS)
  236.     bra.w    _m_out_m0        *eox_wが0ならぱ(bra.w m_out_xx)
  237.  
  238. m_out_m0:                *CZ6BM1-0 MIDI送信
  239.     * < d0.b=data
  240.     * X a4
  241.     jmp    m_out_m0_patch.l    *MIDI出力ルーチンのパッチ時に使われる
  242. m_out_m0_patch:
  243.     tst.b    d0            *ARS
  244.     bpl    exit_ars0_
  245.     cmpi.b    #$f8,d0
  246.     bcc    exit_ars0_
  247.     cmpi.b    #$f0,d0
  248.     bcs    @f
  249.     clr.b    stat0-work(a6)        *clear status byte
  250.     bra    exit_ars0_
  251. @@:
  252.     cmp.b    stat0(pc),d0        *オートマチックランニングステータス機能(ARS)
  253.     beq    2f
  254.     move.b    d0,stat0-work(a6)    *save status byte
  255. exit_ars0_:
  256.     move.l    m_buffer_0(pc),a4
  257.     move.w    sr,-(sp)
  258.     ori.w    #$0700,sr
  259.     btst.b    #6,r06_0(pc)        *割り込みモードか
  260.     bne    set_mb            *yes
  261.     *ダイレクト
  262.     move.b    #$05,rgr
  263.     midiwait
  264.     btst.b    #6,grp4
  265.     beq    @f            *ハード・バッファフル
  266.     move.b    d0,grp6
  267.     midiwait
  268.     move.w    (sp)+,sr
  269. 2:
  270.     rts
  271. @@:                    *割り込み送信準備
  272.     move.w    d1,-(sp)
  273.     move.w    m_buffer_sp(a4),d1
  274.     move.w    d1,m_buffer_ip(a4)
  275.     move.w    #1,m_len(a4)
  276.     move.b    d0,m_buffer(a4,d1.w)
  277.     addq.w    #1,d1
  278.     andi.w    #mbufsz-1,d1
  279.     move.w    d1,m_buffer_sp(a4)
  280.     lea    r06_0(pc),a4
  281.     ori.b    #%0100_0000,(a4)
  282.     clr.b    rgr
  283.     midiwait
  284.     move.b    (a4),grp6
  285.     midiwait
  286.     move.w    (sp)+,d1
  287.     move.w    (sp)+,sr
  288.     rts
  289. set_mb:                    *ソフトバッファへの書き込み
  290.     cmp.w    #mbufsz,m_len(a4)    *ソフト・バッファ・フルかどうか
  291.     bne    @f
  292.     andi.w    #$f8ff,sr        *all int. enable
  293. smlp0:
  294.     cmp.w    #mbufsz,m_len(a4)    *ソフト・バッファ・フルかどうか
  295.     beq    smlp0
  296.     ori.w    #$0700,sr
  297. @@:
  298.     move.w    d1,-(sp)
  299.     move.w    m_buffer_sp(a4),d1
  300.     move.b    d0,m_buffer(a4,d1.w)
  301.     addq.w    #1,d1
  302.     andi.w    #mbufsz-1,d1
  303.     move.w    d1,m_buffer_sp(a4)
  304.     addq.w    #1,m_len(a4)
  305.     move.w    (sp)+,d1
  306.     move.w    (sp)+,sr
  307.     rts
  308.  
  309. m_out_m1:                *CZ6BM1-1 MIDI送信
  310.     * < d0.b=data
  311.     * X a4
  312.     jmp    m_out_m1_patch.l    *MIDI出力ルーチンのパッチ時に使われる
  313. m_out_m1_patch:
  314.     tst.b    d0            *ARS
  315.     bpl    exit_ars1_
  316.     cmpi.b    #$f8,d0
  317.     bcc    exit_ars1_
  318.     cmpi.b    #$f0,d0
  319.     bcs    @f
  320.     clr.b    stat1-work(a6)        *clear status byte
  321.     bra    exit_ars1_
  322. @@:
  323.     cmp.b    stat1(pc),d0        *オートマチックランニングステータス機能(ARS)
  324.     beq    2f
  325.     move.b    d0,stat1-work(a6)    *save status byte
  326. exit_ars1_:
  327.     move.l    m_buffer_1(pc),a4
  328.     move.w    sr,-(sp)
  329.     ori.w    #$0700,sr
  330.     btst.b    #6,r06_1(pc)        *割り込みモードか
  331.     bne    set_mb            *yes
  332.     *ダイレクト
  333.     move.b    #$05,rgr+$10
  334.     midiwait
  335.     btst.b    #6,grp4+$10
  336.     beq    @f            *ハード・バッファフル
  337.     move.b    d0,grp6+$10
  338.     midiwait
  339.     move.w    (sp)+,sr
  340. 2:
  341.     rts
  342. @@:                    *割り込み送信準備
  343.     move.w    d1,-(sp)
  344.     move.w    m_buffer_sp(a4),d1
  345.     move.w    d1,m_buffer_ip(a4)
  346.     move.w    #1,m_len(a4)
  347.     move.b    d0,m_buffer(a4,d1.w)
  348.     addq.w    #1,d1
  349.     andi.w    #mbufsz-1,d1
  350.     move.w    d1,m_buffer_sp(a4)
  351.     lea    r06_1(pc),a4
  352.     ori.b    #%0100_0000,(a4)
  353.     clr.b    rgr+$10
  354.     midiwait
  355.     move.b    (a4),grp6+$10
  356.     midiwait
  357.     move.w    (sp)+,d1
  358.     move.w    (sp)+,sr
  359.     rts
  360.  
  361. m_out_r0:                *RS-MIDI送信 0
  362.     * < d0.b=data
  363.     jmp    @f.l                *MIDI出力ルーチンのパッチ時に使われる
  364. @@:
  365.     tst.b    current_rs232c_part-work(a6)    *0?
  366.     beq    @f
  367.     swap    d0
  368.     move.w    #$f5,d0
  369.     bsr    @f
  370.     move.w    #$01,d0
  371.     bsr    @f
  372.     swap    d0
  373.     clr.b    current_rs232c_part-work(a6)
  374. @@:
  375. m_out_r0_patch:
  376.     tst.b    d0            *ARS
  377.     bpl    exit_arsr0_
  378.     cmpi.b    #$f8,d0
  379.     bcc    exit_arsr0_
  380.     cmpi.b    #$f0,d0
  381.     bcs    @f
  382.     clr.b    statr0-work(a6)        *clear status byte
  383.     bra    exit_arsr0_
  384. @@:
  385.     cmp.b    statr0(pc),d0        *オートマチックランニングステータス機能(ARS)
  386.     beq    2f
  387.     move.b    d0,statr0-work(a6)    *save status byte
  388. exit_arsr0_:
  389.     move.l    m_buffer_r(pc),a4
  390.     move.w    sr,-(sp)
  391.     ori.w    #$0700,sr
  392.     *ダイレクト
  393.     tst.w    m_len(a4)
  394.     bne    set_mb            *ソフトバッファへ
  395.     tst.b    scc_a            *!!!Dummy
  396.     btst.b    #2,scc_a
  397.     beq    set_mb            *ソフトバッファへ
  398.     move.w    (sp)+,sr
  399.     move.b    d0,scc_a+2        *出力
  400. 2:
  401.     rts
  402.  
  403. m_out_r1:                *RS-MIDI送信 1
  404.     * < d0.b=data
  405.     jmp    @f.l                *MIDI出力ルーチンのパッチ時に使われる
  406. @@:
  407.     tst.b    current_rs232c_part-work(a6)    *-1?
  408.     bmi    @f
  409.     swap    d0
  410.     move.w    #$f5,d0
  411.     bsr    @f
  412.     move.w    #$02,d0
  413.     bsr    @f
  414.     swap    d0
  415.     st.b    current_rs232c_part-work(a6)
  416. @@:
  417. m_out_r1_patch:
  418.     tst.b    d0            *ARS
  419.     bpl    exit_arsr1_
  420.     cmpi.b    #$f8,d0
  421.     bcc    exit_arsr1_
  422.     cmpi.b    #$f0,d0
  423.     bcs    @f
  424.     clr.b    statr1-work(a6)        *clear status byte
  425.     bra    exit_arsr1_
  426. @@:
  427.     cmp.b    statr1(pc),d0        *オートマチックランニングステータス機能(ARS)
  428.     beq    2f
  429.     move.b    d0,statr1-work(a6)    *save status byte
  430. exit_arsr1_:
  431.     move.l    m_buffer_r(pc),a4
  432.     move.w    sr,-(sp)
  433.     ori.w    #$0700,sr
  434.     *ダイレクト
  435.     tst.w    m_len(a4)
  436.     bne    set_mb            *ソフトバッファへ
  437.     tst.b    scc_a            *!!!Dummy
  438.     btst.b    #2,scc_a
  439.     beq    set_mb            *ソフトバッファへ
  440.     move.w    (sp)+,sr
  441.     move.b    d0,scc_a+2        *出力
  442. 2:
  443.     rts
  444.                     *チャンネルワークおよびARSを使用しないならば
  445.                     *各MIDI転送ルーチンの先頭のbsr midi_map_?を
  446.                     *殺す
  447. midi_map    macro    xx,mmX_adr
  448.     * < d0.b=data
  449.     * > minus:no send
  450.     movem.l    d0-d1,-(sp)
  451.     move.b    d0,d1
  452.     bpl    data_byte_&xx
  453.     cmpi.b    #$f8,d0            *system realtime message
  454.     bcc    exit_mm&xx
  455.     cmpi.b    #$f0,d0            *system common & EXC (ステータスクリア)
  456.     bcc    stcl_mm&xx
  457.     cmp.b    stat&xx(pc),d0        *オートマチックランニングステータス機能(ARS)
  458.     beq    no_send&xx
  459.     move.b    d0,stat&xx-work(a6)    *save status byte
  460.     move.b    #2,order&xx-work(a6)    *data byte counter初期化
  461. exit_mm&xx:
  462.     moveq.l    #0,d0
  463.     movem.l    (sp)+,d0-d1
  464.     rts
  465.  
  466. send_mm&xx:                *必ず送信
  467.     moveq.l    #0,d0
  468.     movem.l    (sp)+,d0-d1
  469.     rts
  470.  
  471. stcl_mm&xx:                *status clear case and send.(いかなる時も送信)
  472.     clr.b    stat&xx-work(a6)
  473.     movem.l    (sp)+,d0-d1
  474.     rts
  475.  
  476. no_send&xx:                *送信処理省略
  477.     moveq.l    #-1,d0
  478.     movem.l    (sp)+,d0-d1
  479.     rts
  480.  
  481. *case_ch_mask_midi&xx:            *MIDIのチャンネルマスク実行時
  482. *    move.b    stat&xx(pc),d0
  483. *    andi.b    #$0f,d0
  484. *    move.w    mask_midi_ch&xx(pc),d1
  485. *    btst.l    d0,d1
  486. *    beq    send_mm&xx
  487. *    moveq.l    #-1,d0            *送信処理省略
  488. *    movem.l    (sp)+,d0-d1
  489. *    rts
  490.  
  491. data_byte_&xx:
  492.     *以下はチャンネルワークモード
  493.     move.b    stat&xx(pc),d1
  494.     beq    send_mm&xx
  495.                     *ctrl change
  496.     cmpi.b    #$af,d1
  497.     bls    exit_mm&xx        *素通り(note on/off, polyphonic pressure)
  498.     cmpi.b    #$bf,d1
  499.     bhi    _cf_&xx
  500.     subq.b    #1,order&xx-work(a6)    *何番目のデータか
  501.     bne    @f
  502.     andi.w    #$0f,d1
  503.     add.w    d1,d1
  504.     move.w    chwkvn_&xx(pc,d1.w),a4
  505.     adda.l    mmX_adr(pc),a4
  506.     move.b    #2,order&xx-work(a6)    *データ順列パラメータ初期化
  507.     move.w    ctrl_n&xx(pc),d1        *ctrl number
  508.     move.b    d0,__b0(a4,d1.w)
  509.     bra    exit_mm&xx
  510. @@:
  511.     move.b    d0,ctrl_n&xx+1-work(a6)
  512.     bra    exit_mm&xx
  513. _cf_&xx:                    *program change
  514.     cmpi.b    #$cf,d1
  515.     bhi    _df_&xx
  516.     andi.w    #$0f,d1
  517.     add.w    d1,d1
  518.     move.w    chwkvn_&xx(pc,d1.w),a4
  519.     adda.l    mmX_adr(pc),a4
  520.     move.b    d0,__c0(a4)
  521.     bra    exit_mm&xx
  522. chwkvn_&xx:
  523.     dc.w    chwklen*0,chwklen*1,chwklen*2,chwklen*3
  524.     dc.w    chwklen*4,chwklen*5,chwklen*6,chwklen*7
  525.     dc.w    chwklen*8,chwklen*9,chwklen*10,chwklen*11
  526.     dc.w    chwklen*12,chwklen*13,chwklen*14,chwklen*15
  527. _df_&xx:                    *channel pressure
  528.     cmpi.b    #$df,d1
  529.     bhi    _ef_&xx
  530.     andi.w    #$0f,d1
  531.     add.w    d1,d1
  532.     move.w    chwkvn_&xx(pc,d1.w),a4
  533.     adda.l    mmX_adr(pc),a4
  534.     move.b    d0,__d0(a4)
  535.     bra    exit_mm&xx
  536. _ef_&xx:                    *pitch bender
  537.     *status xが$ef以上になることはない
  538.     andi.w    #$0f,d1
  539.     add.w    d1,d1
  540.     move.w    chwkvn_&xx(pc,d1.w),a4
  541.     adda.l    mmX_adr(pc),a4
  542.     subq.b    #1,order&xx-work(a6)    *何番目のデータか
  543.     bne    @f
  544.     subq.w    #1,a4
  545.     move.b    #2,order&xx-work(a6)    *データ順列パラメータ初期化
  546. @@:
  547.     move.b    d0,__e0+1(a4)        *わざと+1
  548.     bra    exit_mm&xx
  549.     endm
  550.  
  551. midi_map_0:    midi_map    0,mm0_adr
  552. midi_map_1:    midi_map    1,mm1_adr
  553. midi_map_r0:    midi_map    r0,mmr0_adr
  554. midi_map_r1:    midi_map    r1,mmr1_adr
  555.  
  556. opmset:
  557.     move.w    sr,-(sp)
  558.     ori.w    #$0700,sr
  559.     opmset    d1,d2
  560.     bsr    case_special_opmset
  561. opmset_patch1:                *FMマップ省略時bra exit_opmset
  562.     andi.w    #$ff,d1
  563.     move.b    d2,opmreg(a6,d1.w)
  564. exit_opmset:
  565.     move.w    (sp)+,sr
  566.     rts
  567.  
  568. opmset_se:                *効果音モード時のOPM書き込み
  569.     move.w    sr,-(sp)
  570.     ori.w    #$0700,sr
  571.     cmpi.b    #$20,d1            *グローバルレジスタ系は書き込む
  572.     bcs    @f
  573.     btst.b    d1,mask_opm_ch-work(a6)    *効果音で使用しているチャンネルか
  574.     beq    _os0
  575.     bra    wkst_os            *効果音で使用中のチャンネルの場合
  576. @@:
  577.     cmpi.b    #$08,d1            *キーオン、オフ関係か
  578.     bne    @f
  579.     btst.b    d2,mask_opm_ch-work(a6)    *効果音で使用しているチャンネルか(わざとd2)
  580.     beq    _os0
  581.     bra    wkst_os
  582. @@:
  583.     cmpi.b    #$0f,d1            *noise set
  584.     beq    wkst_os
  585. _os0:
  586.     opmset    d1,d2
  587.     bsr    case_special_opmset
  588. wkst_os:
  589.     andi.w    #$ff,d1
  590.     move.b    d2,opmreg(a6,d1.w)
  591.     move.w    (sp)+,sr
  592.     rts
  593.  
  594. case_special_opmset:            *特殊処理レジスタ群
  595.     cmpi.b    #$1b,d1            *$1cより上は対象外
  596.     bhi    exit_cso
  597.     bne    @f
  598.     move.b    d2,OPMCTRL.w        *OSのワークへもセットする
  599. exit_cso:
  600.     rts
  601. @@:
  602.     cmpi.b    #$08,d1            *KEY ON/OFF
  603.     bne    @f
  604.     move.w    d0,-(sp)
  605.     move.l    d2,d0
  606.     andi.w    #7,d0
  607.     move.b    d2,opm_kon-work(a6,d0.w)
  608.     move.w    (sp)+,d0
  609.     rts
  610. @@:                    *PMD
  611.     cmpi.b    #$19,d1
  612.     bne    @f
  613.     tst.b    d2
  614.     bpl    @f
  615.     move.b    d2,opm_pmd-work(a6)
  616. @@:
  617.     rts
  618.  
  619. restore_af:
  620. restore_opm:                *効果音トラック終了時の処理
  621.     * < d4.w=opm ch(0-7)
  622.     * - all
  623.     move.w    sr,-(sp)
  624.     ori.w    #$0700,sr
  625.     movem.l    d0-d1,-(sp)
  626.     moveq.l    #$20,d0
  627.     add.b    d4,d0
  628.     moveq.l    #28-1,d1
  629. @@:
  630.     opmset    d0,<opmreg(a6,d0.w)>
  631.     addq.b    #8,d0
  632.     dbra    d1,@b
  633.     opmset    #$0f,<opmreg+$0f(a6)>    *noise
  634.     movem.l    (sp)+,d0-d1
  635.     move.w    (sp)+,sr
  636.     rts
  637.  
  638. *restore_af:                *マスクトラックの復元
  639. *    * < d4.w=opm ch(0-7)
  640. *    * x d0
  641. *    move.w    sr,-(sp)
  642. *    ori.w    #$0700,sr
  643. *    moveq.l    #$20,d0
  644. *    add.b    d4,d0
  645. *    opmset    d0,<opmreg(a6,d0.w)>
  646. *    move.w    (sp)+,sr
  647. *    rts
  648.  
  649. copy_opm_timbre:            *他チャンネルの音色をコピーする
  650.     * < d1.b=実行ch
  651.     * < d5.b=copy元ch
  652.     * x d0-d2,a2
  653.     move.w    sr,-(sp)
  654.     ori.w    #$0700,sr
  655.     move.b    ol1-work(a6,d5.w),ol1-work(a6,d1.w)
  656.     move.b    ol2-work(a6,d5.w),ol2-work(a6,d1.w)
  657.     move.b    ol3-work(a6,d5.w),ol3-work(a6,d1.w)
  658.     move.b    ol4-work(a6,d5.w),ol4-work(a6,d1.w)
  659.     move.b    opm_nom-work(a6,d5.w),opm_nom-work(a6,d1.w)
  660.     move.b    cf-work(a6,d5.w),cf-work(a6,d1.w)
  661.  
  662.     move.l    d1,d0
  663. *init_rr:            *音色切り換え時にプチといわせない処理
  664.     moveq.l    #$e0,d1
  665.     add.b    d0,d1
  666.     moveq.l    #$ff,d2
  667.     opmset    d1,d2
  668.     addq.b    #8,d1
  669.     opmset    d1,d2
  670.     addq.b    #8,d1
  671.     opmset    d1,d2
  672.     addq.b    #8,d1
  673.     opmset    d1,d2
  674.  
  675.     lea    opmreg+$20(a6,d5.w),a2    *source addr.
  676.     moveq.l    #$20,d1
  677.     add.b    d0,d1
  678.     move.b    (a2),d2
  679.     bsr    opmset
  680.  
  681.     add.b    #$18,d1
  682.     lea    $18(a2),a2
  683.     moveq.l    #25-1,d0
  684. @@:
  685.     move.b    (a2),d2
  686.     bsr    opmset
  687.     addq.w    #8,d1
  688.     addq.w    #8,a2
  689.     dbra    d0,@b
  690.     move.w    (sp)+,sr
  691.     rts
  692.  
  693. di_tmf    macro
  694.     andi.b    #$f7,$00e88015    *MFP FM_int off
  695.     endm
  696.  
  697. ei_tmf    macro
  698.     ori.b    #$08,$00e88015    *MFP FM_int ON
  699.     endm
  700.  
  701. stop_tm_int_se:
  702. di_tmf:
  703.     di_tmf
  704.     rts
  705.  
  706. start_tm_int_se:
  707. ei_tmf:
  708.     ei_tmf
  709.     rts
  710.  
  711. di_tmm    macro
  712.     move.b    #$80,icr
  713.     midiwait
  714.     clr.b    rgr
  715.     midiwait
  716.     andi.b    #$7f,r06_0-work(a6)
  717.     move.b    r06_0(pc),grp6
  718.     midiwait
  719.     endm
  720.  
  721. ei_tmm    macro
  722.     clr.b    rgr
  723.     midiwait
  724.     tas.b    r06_0-work(a6)
  725.     move.b    r06_0(pc),grp6
  726.     midiwait
  727.     endm
  728.  
  729. stop_tm_int_ms:            *タイマによってパッチが当たる
  730.     di_tmm
  731.     rts
  732.  
  733. start_tm_int_ms:        *タイマによってパッチが当たる
  734.     ei_tmm
  735.     rts
  736.  
  737. di_tme    macro
  738.     move.b    #$04,icr
  739.     midiwait
  740.     clr.b    rgr
  741.     midiwait
  742.     bclr.b    #2,r06_0-work(a6)
  743.     move.b    r06_0(pc),grp6
  744.     midiwait
  745.     endm
  746.  
  747. ei_tme    macro
  748.     move.b    #$07,rgr
  749.     midiwait
  750.  
  751.     move.b    itpl_rate-work(a6),grp5
  752.     midiwait
  753.     clr.b    rgr
  754.     midiwait
  755.     bset.b    #2,r06_0-work(a6)
  756.     move.b    r06_0(pc),grp6
  757.     midiwait
  758.     endm
  759.  
  760. di_tme:
  761.     di_tme
  762.     rts
  763.  
  764. ei_tme:
  765.     ei_tme
  766.     rts
  767.  
  768. int_rm_ope:            *リアルタイムメッセージ受信処理
  769. reglist    reg    d0-d7/a0-a6
  770.     movem.l    reglist,-(sp)
  771.     lea    work(pc),a6
  772.     move.b    #$01,icr        *int clr
  773.     midiwait
  774. iro_lp:
  775.     move.b    #$01,rgr
  776.     midiwait
  777.     move.b    grp6,d0            *read R16($F8~$FF)
  778.     beq    exit_iro        *d0=0のときはバッファ空
  779.     cmpi.b    #$fa,d0
  780.     beq    iro_start
  781.     move.b    d0,grp5            *R15へ出力
  782.     midiwait
  783.     move.b    #$01,grp7        *FIFO-IRx更新(R17)
  784.     midiwait
  785.     cmpi.b    #$fb,d0
  786.     beq    iro_cont
  787.     cmpi.b    #$fc,d0
  788.     bne    iro_lp
  789. iro_stop:
  790.     jbsr    m_stop_all
  791.     bra    iro_lp
  792.  
  793. iro_start:
  794.     tas    start_wait_flg-work(a6)
  795.     bpl    @f
  796.     jbsr    m_play_all
  797.     move.b    #$01,rgr
  798.     midiwait
  799. @@:
  800.     move.b    #$FA,grp5        *R15へ出力
  801.     midiwait
  802.     move.b    #$01,grp7        *FIFO-IRx更新(R17)
  803.     midiwait
  804.     bra    iro_lp
  805.  
  806. iro_cont:
  807.     jbsr    m_cont_all
  808.     bra    iro_lp
  809. exit_iro:
  810.     movem.l    (sp)+,reglist
  811.     rte            *割り込み処理終了
  812.  
  813. opmwait:
  814. @@:
  815.     tst.b    fm_data_port    *busy check
  816.     nop
  817.     bmi    @b
  818. midiwait:
  819.     tst.b    $e9a001    *ダミー
  820.     nop        *040への対応の意味を含めて(アドバイスありがとう)
  821.     rts        *NOPはパイプラインを崩して本当にウェイトを与える目的で行っている
  822.  
  823. v_wait:
  824. @@:
  825.     btst.b    #4,$e88001
  826.     beq    @b
  827. @@:
  828.     btst.b    #4,$e88001
  829.     bne    @b
  830.     rts
  831.  
  832. h_wait:                *単なるウェイト
  833.     * < d0.w=loop counter    *d0*(1/60/512)秒のウェイト
  834. hsy_lp01:
  835.     tst.b    $e88001
  836.     bpl    hsy_lp01
  837. hsy_lp02:
  838.     tst.b    $e88001
  839.     bmi    hsy_lp02
  840.     dbra    d0,hsy_lp01
  841.     rts
  842.  
  843. rec_int:            *データを受信するとここへ来る (CZ6BM1 #0)
  844. reglist    reg    d0-d2/a0/a2
  845.     ori.w    #$0700,sr
  846.     movem.l    reglist,-(sp)
  847.     lea    rgr,a2
  848.     move.l    rec_buffer_0(pc),a0
  849. ri0:
  850.     move.w    rec_read_ptr(a0),d1
  851.     move.w    rec_write_ptr(a0),d2
  852.     move.b    #$03,(a2)
  853.                     midiwait
  854. @@:
  855.     tst.b    grp4-rgr(a2)
  856.     bpl    @f
  857.     move.b    grp6-rgr(a2),d0
  858.                     *midiwait
  859.     cmpi.b    #$fe,d0
  860.     beq    @b
  861. *    cmpi.b    #$f8,d0            *MIDIクロックフィルタを有効にすれば必要無し
  862. *    beq    @b
  863.     move.b    d0,rec_buffer(a0,d2.w)
  864.     st.b    rec_buf_stat(a0)    *有効データありフラグON
  865.     addq.w    #1,d2
  866.     andi.w    #recbufsize-1,d2
  867.     cmp.w    d1,d2
  868.     bne    @b
  869.     st.b    rec_buf_err(a0)        *書き込みポインタが1周してしまった
  870. *    bsr    play_beep        *バッファ溢れを起こしたら警告音を鳴らす(DEBUG)
  871.     bra    @b
  872. @@:
  873.     move.w    d2,rec_write_ptr(a0)
  874.     move.b    #$20,icr-rgr(a2)    *int clr
  875.                     midiwait
  876.     movem.l    (sp)+,reglist
  877.     rte
  878.  
  879. rec_int2:            *データを受信するとここへ来る (CZ6BM1 #1)
  880.     ori.w    #$0700,sr
  881.     movem.l    reglist,-(sp)
  882.     lea    rgr+$10,a2
  883.     move.l    rec_buffer_1(pc),a0
  884.     bra    ri0
  885.  
  886. es_int:
  887.     ori.w    #$0700,sr
  888.     tst.b    scc_a        *!!!Dummy
  889.     move.b    #$38,scc_a
  890.     rte
  891.  
  892. sp_int:
  893.     ori.w    #$0700,sr
  894.     tst.b    scc_a
  895.     move.b    #$30,scc_a
  896.     move.b    #$38,scc_a
  897.     rte
  898.  
  899. rec_int_r:            *データを受信するとここへ来る
  900.     ori.w    #$0700,sr
  901.     movem.l    reglist,-(sp)
  902.     lea    scc_a,a2
  903.     tst.b    (a2)        *!!!Dummy
  904.     move.l    rec_buffer_r(pc),a0
  905.     move.w    rec_read_ptr(a0),d1
  906.     move.w    rec_write_ptr(a0),d2
  907. @@:
  908.     btst.b    #0,(a2)
  909.     beq    @f
  910.     move.b    2(a2),d0
  911.     cmpi.b    #$fe,d0
  912.     beq    @b
  913.     cmpi.b    #$f8,d0
  914.     beq    @b
  915.     move.b    d0,rec_buffer(a0,d2.w)
  916.     st.b    rec_buf_stat(a0)    *有効データありフラグON
  917.     addq.w    #1,d2
  918.     andi.w    #recbufsize-1,d2
  919.     cmp.w    d1,d2
  920.     bne    @b
  921.     st.b    rec_buf_err(a0)        *書き込みポインタが1周してしまった
  922. *    bsr    play_beep        *バッファ溢れを起こしたら警告音を鳴らす
  923.     bra    @b
  924. @@:
  925.     move.w    d2,rec_write_ptr(a0)
  926.     move.b    #$38,(a2)    *割り込みリセット
  927.     movem.l    (sp)+,reglist
  928.     rte
  929.  
  930. smf_entry:
  931.     tst.b    smf_end_flag-work(a6)
  932.     beq    exit_smf_entry
  933.     tst.l    smf_delta-work(a6)
  934.     beq    tsd_lp00
  935.     subq.l    #1,smf_delta-work(a6)
  936.     bne    exit_smf_entry
  937. tsd_lp00:
  938.     move.l    smf_running(pc),d2    *running count host
  939.     move.l    smf_pointer(pc),a2
  940.     move.l    smf_transfer(pc),a5
  941. tsd_lp01:
  942.     moveq.l    #0,d0
  943.     move.b    (a2)+,d0        *get event
  944.     bmi    event_head
  945.     jsr    (a5)
  946.     subq.l    #1,d2
  947.     bne    tsd_lp01
  948. get_dlt:
  949.     bsr    getval            *delta time
  950.     move.l    a2,smf_pointer-work(a6)
  951.     move.l    d0,smf_delta-work(a6)
  952.     beq    tsd_lp00
  953. exit_smf_entry:
  954.     rts
  955.  
  956. event_head:
  957.     cmpi.b    #$f7,d0
  958.     beq    smf_sysex
  959.     cmpi.b    #$ff,d0
  960.     beq    meta_events
  961.     jsr    (a5)
  962.     cmpi.b    #$f0,d0
  963.     beq    smf_sysex
  964.     lsr.b    #4,d0
  965.     subq.b    #8,d0
  966.     moveq.l    #0,d2
  967.     move.b    minpjtbl(pc,d0.w),d2
  968.     move.l    d2,smf_running-work(a6)
  969.     bra    tsd_lp01
  970. minpjtbl:            *$80,$90,$a0,$b0,$c0,$d0,$e0,$f0が
  971.     dc.b    2,2,2,2,1,1,2,0    *それぞれ何バイトのデータバイトを取るか
  972.  
  973. smf_sysex:            *SYSEX
  974.     bsr    getval        *get data count
  975.     move.l    d0,d2
  976.     beq    get_dlt
  977. @@:
  978.     move.b    (a2)+,d0        *get event
  979.     jsr    (a5)
  980.     subq.l    #1,d2
  981.     bne    @b
  982.     bra    get_dlt
  983.  
  984. meta_events:
  985.     move.b    (a2)+,d0    *event type
  986.     cmpi.b    #$2f,d0        *track end
  987.     beq    @f
  988.     cmpi.b    #$51,d0        *tempo
  989.     beq    set_smf_tempo
  990.     bsr    getval        *data length
  991.     add.l    d0,a2
  992.     bra    get_dlt
  993. @@:                    *終了処理
  994.     tst.b    smf_end_flag-work(a6)
  995.     bmi    @f
  996.     jbsr    release_int_mode    *割り込みモードなら解除
  997. @@:
  998.     clr.b    smf_end_flag-work(a6)
  999.     bra    exit_smf_entry
  1000.  
  1001. set_smf_tempo:
  1002.     addq.w    #1,a2        *skip 03
  1003.     moveq.l    #0,d1
  1004.     move.b    (a2)+,d1
  1005.     swap    d1
  1006.     move.b    (a2)+,d1
  1007.     lsl.w    #8,d1
  1008.     move.b    (a2)+,d1
  1009.     move.l    #60*1000*1000,d0
  1010.     bsr    wari        *1000,000/smf_tempo    (d0/d1)
  1011.     tst.b    smf_end_flag-work(a6)
  1012.     bpl    @f
  1013.     move.w    d0,d2
  1014.     lea    tempo_value(pc),a1
  1015.     jsr    smf_tempo-work(a6)
  1016.     bra    get_dlt
  1017. @@:                *割り込みモード時
  1018.     move.l    smf_mst_clk(pc),d1
  1019.     move.w    d0,d1        *d1.hw=マスタークロック/d1.lw=テンポ
  1020.     lea    -1.w,a1        *a1.l=-1:テンポ変更モード
  1021.     bsr    set_int_service
  1022.     bra    get_dlt
  1023.  
  1024. getval:
  1025.     * > d0.l=data
  1026.     * - all
  1027.     move.l    d1,-(sp)
  1028.     moveq.l    #0,d0
  1029.     moveq.l    #0,d1
  1030.     move.b    (a2)+,d1
  1031.     bpl    1f
  1032. @@:
  1033.     andi.b    #$7f,d1
  1034.     or.b    d1,d0
  1035.     lsl.l    #7,d0
  1036.     move.b    (a2)+,d1
  1037.     bmi    @b
  1038. 1:
  1039.     or.b    d1,d0
  1040.     move.l    (sp)+,d1
  1041.     rts
  1042.